/**
 * 腾讯地图经纬度转换
 * @param {String} longitude
 * @param {String} latitude
 * @returns {Object}
 */
export const txMapToBdMap = function (longitude, latitude) {
  let pi = 3.14159265358979324
  let x = parseFloat(longitude)
  let y = parseFloat(latitude)
  let z = Math.sqrt(x * x + y * y) + 0.00002 * Math.sin(y * pi)
  let theta = Math.atan2(y, x) + 0.000003 * Math.cos(x * pi)
  return {
    longitude: (z * Math.cos(theta) + 0.0065).toFixed(7),
    latitude: (z * Math.sin(theta) + 0.006).toFixed(7)
  }
}

/**
 * 百度地图经纬度转换
 * @param {String} longitude
 * @param {String} latitude
 * @returns {Object}
 */
export const bdMapToTxMap = function (longitude, latitude) {
  let pi = (3.14159265358979324 * 3000.0) / 180.0
  let x = longitude - 0.0065
  let y = latitude - 0.006
  let z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * pi)
  let theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * pi)
  return {
    longitude: z * Math.cos(theta),
    latitude: z * Math.sin(theta)
  }
}

/**
 * 对富文本进行预处理
 * @param {String} cont
 * @returns {String}
 */
export const imgStyle = function (cont) {
  let myContent = cont.replace(/<img[^>]*>/gi, function (match, capture) {
    return match.replace(/(<img[^>]*)(\/?>)/gi, "$1 style='max-width:100%;height:auto;' $2")
  })
  return myContent
    .replace(/<\!--\[if[\s\S]*?\]>[\s\S]*?<\!\[endif\]-->/gi, '') //替换了xml标签word粘贴带出一堆标签包含在xml里干掉它
    .replace(/<xml>[\s\S]*?<\/xml>/gi, '') //替换了xml标签word粘贴带出一堆标签包含在xml里干掉它
    .replace(/&nbsp;/g, '\xa0') //替换空格
}

/**
 * @description: 防抖函数
 * @param {Function} fun 要执行的函数
 * @param {Number} delay 延迟时间
 * @return {Function}
 */
export const debounce = function (fun, delay) {
  let timer = null
  return function (...args) {
    timer && clearTimeout(timer)
    timer = setTimeout(() => {
      fun.apply(this, args)
      timer = null
    }, delay)
  }
}

/**
 * @description: 节流函数
 * @param {Function} fun 要执行的函数
 * @param {Number} delay 多久执行一次
 * @return {Function} 返回的函数
 */
export const throttle = function (fun, delay) {
  let timer = false
  return function (...args) {
    if (!timer) {
      fun.apply(this, args)
      timer = true
      setTimeout(() => {
        timer = false
      }, delay)
    }
  }
}

// 判断类型集合
export const checkStr = (str, type) => {
  switch (type) {
    case 'mobile': //手机号码
      return /^(((13[0-9]{1})|(14[0-9]{1})|(15[0-9]{1})|(16[0-9]{1})|17[0-9]{1}|(18[0-9]{1})|(19[0-9]{1}))+\d{8})$/.test(str)
    case 'tel': //座机
      return /^(0\d{2,3}-\d{7,8})(-\d{1,4})?$/.test(str)
    case 'IDNumber': //身份证
      return /^[1-9]\d{5}(18|19|20|(3\d))\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/.test(str)
    case 'bankCard': // 银行卡
      return /^([1-9]{1})(\d{14}|\d{18})$/.test(str)
    case 'mobileCode': //6位数字验证码
      return /^[0-9]{6}$/.test(str)
    case 'pwd': //密码以字母开头，长度在6~18之间，只能包含字母、数字和下划线
      return /^[0-9a-zA-Z]{5,}$/.test(str)
    case 'payPwd': //支付密码 6位纯数字
      return /^[0-9]{6}$/.test(str)
    case 'postal': //邮政编码
      return /[1-9]\d{5}(?!\d)/.test(str)
    case 'QQ': //QQ号
      return /^[1-9][0-9]{4,9}$/.test(str)
    case 'email': //邮箱
      return /^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$/.test(str)
    case 'money': //金额(小数点2位)
      return /^\d*(?:\.\d{0,2})?$/.test(str)
    case 'URL': //网址
      return /(http|ftp|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?/.test(str)
    case 'IP': //IP
      return /((?:(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d))/.test(str)
    case 'date': //日期时间
      return /^(\d{4})\-(\d{2})\-(\d{2}) (\d{2})(?:\:\d{2}|:(\d{2}):(\d{2}))$/.test(str) || /^(\d{4})\-(\d{2})\-(\d{2})$/.test(str)
    case 'number': //数字
      return /^[0-9]$/.test(str)
    case 'english': //英文
      return /^[a-zA-Z]+$/.test(str)
    case 'chinese': //中文
      return /^[\\u4E00-\\u9FA5]+$/.test(str)
    case 'lower': //小写
      return /^[a-z]+$/.test(str)
    case 'upper': //大写
      return /^[A-Z]+$/.test(str)
    case 'HTML': //HTML标记
      return /<("[^"]*"|'[^']*'|[^'">])*>/.test(str)
    default:
      return true
  }
}
